home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 February: Tool Chest / Apple Developer CD Series Tool Chest February 1996 (Apple Computer)(1996).iso / Tool Chest / Testing & Debugging / General tools / Audit app & dcmd / Src / DisplayAuditPreferences.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-09-17  |  7.5 KB  |  284 lines  |  [TEXT/KAHL]

  1. /*                                    AuditDocument.c                                */
  2. /*
  3.  * DisplayAudit.c
  4.  * Copyright © 1992-93, Apple Computer Inc. All Rights Reserved.
  5.  * Programmed by Martin Minow,
  6.  *    Internet:    minow@apple.com
  7.  *    AppleLink:    MINOW
  8.  * Note: During development, Think C keeps the application resources in a
  9.  * different file from the application code. Hence, we must save and restore
  10.  * the current resource file, not just blindly slam it back to the application
  11.  * resource file.
  12.  */
  13. #include "DisplayAudit.h"
  14. #include <Folders.h>
  15.  
  16. /*
  17.  * Open an existing AuditParameter file, or create a new one.
  18.  */
  19. void
  20. OpenAuditParameterFile(void)
  21. {
  22.         OSErr                    status;
  23.         short                    saveResFile;
  24.         long                    gestaltResult;
  25.         short                    prefVRefNum;
  26.         long                    prefDirID;
  27.         FSSpec                    prefFSSpec;            /* IM-VI 25-15, 25-30        */
  28.         Str63                    trueFileName;
  29.         Boolean                    newResourceFile;
  30.         StringHandle            infoHandle;            /* For finder info string    */
  31.         Str255                    work;                /* Gets default file name    */
  32.  
  33.         newResourceFile = FALSE;
  34.         infoHandle = NULL;
  35.         saveResFile = CurResFile();
  36.         TRY {
  37.             FailOSErr(
  38.                 Gestalt(gestaltFindFolderAttr, &gestaltResult),
  39.                 kErrSystemVersion
  40.             );
  41.             FailOSErr(
  42.                 FindFolder(
  43.                     kOnSystemDisk,
  44.                     kPreferencesFolderType,
  45.                     kCreateFolder,
  46.                     &prefVRefNum,
  47.                     &prefDirID
  48.                 ),
  49.                 kErrFindPreferenceFolder
  50.             );
  51.             status = SearchForCreatorType(
  52.                         prefVRefNum,
  53.                         prefDirID,
  54.                         trueFileName
  55.                     );
  56.             switch (status) {
  57.             case noErr:
  58.                 /*
  59.                  * The preference file already exists.
  60.                  */
  61.                 status = FSMakeFSSpec(
  62.                             prefVRefNum,
  63.                             prefDirID,
  64.                             trueFileName,
  65.                             &prefFSSpec
  66.                         );
  67.                 FailOSErr(status, kErrOpenPreferenceFile);
  68.                 break;
  69.             case fnfErr:
  70.                 /*
  71.                  * The preferences file did not exist. Create it. FSMakeFSSpec
  72.                  * will fail with a fnfErr. We're in trouble if it succeeds, as
  73.                  * someone else created a file with the same name and a different
  74.                  * owner type.
  75.                  */
  76.                 GetIndString(work, STRN_Strings, kAuditParameterFileName);
  77.                 status = FSMakeFSSpec(prefVRefNum, prefDirID, work, &prefFSSpec);
  78.                 if (status == noErr)
  79.                     status = dupFNErr;
  80.                 else if (status == fnfErr) {
  81.                     FSpCreateResFile(
  82.                         &prefFSSpec,
  83.                         kApplicationCreator,
  84.                         kPreferenceFileType,
  85.                         smRoman
  86.                     );
  87.                     status = ResError();
  88.                     newResourceFile = TRUE;
  89.                 }
  90.                 FailOSErr(status, kErrCreatePreferenceFile);
  91.                 break;
  92.             default:
  93.                 FailOSErr(status, kErrFindPreferenceFile);
  94.                 break;
  95.             }
  96.             /*
  97.              * The preference file existed, or could be created.
  98.              */
  99.             gParameterFileRefNum = FSpOpenResFile(&prefFSSpec, fsRdWrPerm);
  100.             FailOSErr(ResError(), kErrOpenPreferenceFile);
  101.             if (newResourceFile) {
  102.                 infoHandle = GetString(STR_FinderString);
  103.                 if (infoHandle != NULL) {
  104.                     DetachResource((Handle) infoHandle);
  105.                     UseResFile(gParameterFileRefNum);
  106.                     AddResource((Handle) infoHandle, 'STR ', STR_FinderIDString, "\p");
  107.                     FailOSErr(ResError(), kErrWritePreferenceResource);
  108.                     WriteResource((Handle) infoHandle);
  109.                     FailOSErr(ResError(), kErrWritePreferenceResource);
  110.                     DisposeHandle((Handle) infoHandle);
  111.                     infoHandle = NULL;
  112.                     FailOSErr(ResError(), kErrWritePreferenceResource);
  113.                     UpdateResFile(gParameterFileRefNum);
  114.                     FailOSErr(ResError(), kErrWritePreferenceResource);
  115.                     UseResFile(saveResFile);
  116.                 }
  117.             }
  118.         }
  119.         CATCH {
  120.             UseResFile(saveResFile);
  121.             ErrorAlert(STATUS, MESSAGE, FALSE);
  122.             if (gParameterFileRefNum != 0) {
  123.                 CloseResFile(gParameterFileRefNum);
  124.                 gParameterFileRefNum = 0;
  125.             }
  126.             if (infoHandle != NULL)
  127.                 DisposeHandle((Handle) infoHandle);
  128.             ParameterFactorySettings();
  129.             NO_PROPAGATE;
  130.         }
  131.         ENDTRY;
  132. }
  133.  
  134. void
  135. ReadAuditParameters(void)
  136. {
  137.         Handle                    parmHandle;
  138.         short                    saveResFile;
  139.         
  140.         if (gParameterFileRefNum != 0) {
  141.             saveResFile = CurResFile();
  142.             TRY {
  143.                 UseResFile(gParameterFileRefNum);
  144.                 FailOSErr(ResError(), kErrReadPreferenceResource);
  145.                 parmHandle = GetResource(kApplicationCreator, PARM_ResourceID);
  146.                 if (parmHandle != NULL && GetHandleSize(parmHandle) == sizeof PARM)
  147.                     BlockMove(*parmHandle, &PARM, sizeof PARM);
  148.                 else {
  149.                     ParameterFactorySettings();
  150.                     gParameterUpdateNeeded = TRUE;
  151.                 }
  152.                 if (parmHandle != NULL) {
  153.                     ReleaseResource(parmHandle);
  154.                     FailOSErr(ResError(), kErrReadPreferenceResource);
  155.                 }
  156.             }
  157.             CATCH {
  158.                 UseResFile(saveResFile);
  159.                 ErrorAlert(STATUS, MESSAGE, FALSE);
  160.                 CloseResFile(gParameterFileRefNum);
  161.                 gParameterFileRefNum = 0;
  162.                 NO_PROPAGATE;
  163.             }
  164.             ENDTRY;
  165.             UseResFile(saveResFile);
  166.         }
  167. }
  168.  
  169. void
  170. WriteAuditParameters(void)
  171. {
  172.         Handle                parmHandle;
  173.         short                saveResFile;
  174.         
  175.         if (gParameterFileRefNum != 0) {
  176.             saveResFile = CurResFile();
  177.             parmHandle = NULL;
  178.             TRY {
  179.                 UseResFile(gParameterFileRefNum);
  180.                 FailOSErr(ResError(), kErrWritePreferenceResource);
  181.                 parmHandle = GetResource(
  182.                         kApplicationCreator,
  183.                         PARM_ResourceID
  184.                     );
  185.                 if (parmHandle != NULL) {
  186.                     /*
  187.                      * Update an existing parameter resource
  188.                      */
  189.                     FailOSErr(MemError(), kErrWritePreferenceResource);
  190.                     SetHandleSize(parmHandle, sizeof PARM);
  191.                     FailOSErr(MemError(), kErrWritePreferenceResource);
  192.                     BlockMove(&PARM, *parmHandle, sizeof PARM);
  193.                     ChangedResource(parmHandle);
  194.                     FailOSErr(ResError(), kErrWritePreferenceResource);
  195.                 }
  196.                 else {
  197.                     /*
  198.                      * Create a new parameter resource
  199.                      */
  200.                     parmHandle = NewHandle(sizeof PARM);
  201.                     FailNIL(parmHandle, kErrWritePreferenceResource);
  202.                     BlockMove(&PARM, *parmHandle, sizeof PARM);
  203.                     AddResource(
  204.                         parmHandle,
  205.                         kApplicationCreator,
  206.                         PARM_ResourceID,
  207.                         "\pParameters"
  208.                     );
  209.                     FailOSErr(ResError(), kErrWritePreferenceResource);
  210.                 }
  211.                 WriteResource(parmHandle);
  212.                 FailOSErr(ResError(), kErrWritePreferenceResource);
  213.                 ReleaseResource(parmHandle);
  214.                 parmHandle = NULL;
  215.                 FailOSErr(ResError(), kErrWritePreferenceResource);
  216.                 UpdateResFile(gParameterFileRefNum);
  217.                 FailOSErr(ResError(), kErrWritePreferenceResource);
  218.             }
  219.             CATCH {
  220.                 UseResFile(saveResFile);
  221.                 ErrorAlert(STATUS, MESSAGE, FALSE);
  222.                 if (parmHandle != NULL)
  223.                     ReleaseResource(parmHandle);
  224.                 CloseResFile(gParameterFileRefNum);
  225.                 gParameterFileRefNum = kNoParamFile;
  226.                 NO_PROPAGATE;
  227.             }
  228.             ENDTRY;
  229.             UseResFile(saveResFile);
  230.             FailOSErr(ResError(), kErrWritePreferenceResource);
  231.         }
  232.         gParameterUpdateNeeded = FALSE;
  233. }
  234.  
  235. /*
  236.  * Initialize the parameter array. The values will be replaced by the current
  237.  * preferences values, if any are read. If we can't read a preferences resource,
  238.  * these values (or whatever the user chooses) will be written.
  239.  */
  240. void
  241. ParameterFactorySettings(void)
  242. {
  243.         PARM.auditIdent = kDefaultAuditIdent;
  244.         PARM.enableAudit = TRUE;
  245.         PARM.auditRecords = kDefaultAuditRecords;
  246.         PARM.logDisplayLines = kDefaultDisplayLines;
  247.         PARM.fontSize = 9;
  248.         GetFontName(applFont, PARM.fontName);
  249. }
  250.  
  251. /*
  252.  * This searches the preference file folder for files with a specific creator and
  253.  * file type. This lets the user rename our preference file without harm.
  254.  */
  255. OSErr
  256. SearchForCreatorType(
  257.         short                            prefVRefNum,
  258.         long                            prefDirID,
  259.         StringPtr                        trueFileName
  260.     )
  261. {
  262.         CInfoPBRec                        specPBRec;
  263.         OSErr                            status;
  264.         register short                    i;
  265. #define SPEC    (specPBRec.hFileInfo)
  266.  
  267.         CLEAR(specPBRec);
  268.         SPEC.ioNamePtr = trueFileName;
  269.         SPEC.ioVRefNum = prefVRefNum;
  270.         for (i = 1;; i++) {
  271.             SPEC.ioDirID = prefDirID;
  272.             SPEC.ioFDirIndex = i;
  273.             status = PBGetCatInfo(&specPBRec, FALSE);
  274.             if (status != noErr)
  275.                 break;
  276.             if (SPEC.ioFlFndrInfo.fdType == kPreferenceFileType
  277.              && SPEC.ioFlFndrInfo.fdCreator == kApplicationCreator)
  278.                 break;
  279.         }
  280.         return (status);
  281. #undef SPEC
  282. }
  283.  
  284.